# -*- coding: utf-8 -*-
__author__ = 'lztkdr'
__date__ = '2020/3/31 21:08'

"""
pandas:
	pandas is an open source,
	 BSD-licensed library providing high-performance, 
	 easy-to-use data structures and data analysis tools for the Python programming language.

	numpy能够帮我们处理处理数值型数据，但是这还不够
	很多时候，我们的数据除了数值之外，还有字符串，还有时间序列等。
	numpy能够帮助我们处理数值，但是pandas除了处理数值之外(基于numpy)，还能够帮助我们处理其他类型的数据

	Pandas是一个强大的分析结构化数据的工具集；
	它的使用基础是Numpy（提供高性能的矩阵运算）；
	用于数据挖掘和数据分析，同时也提供数据清洗功能。
	
Series 一维，带标签数组
DataFrame 二维，Series容器

"""
import numpy as np
import pandas as pd

# Pycharm输出窗口有省略号，数据显示不全解决方法
pd.set_option('display.max_rows', 10)
pd.set_option('display.max_columns', 200)
pd.set_option('display.width', 1000)

dog_file = "./dogNames2.csv"

df = pd.read_csv(dog_file)
print(df.columns)
print(df.index)
print(df.shape)
print(df[df['Count_AnimalName'] < 5])
print("=============================")
print(df[(800 < df["Count_AnimalName"]) | (df["Count_AnimalName"] < 1000)])
print("=============================")
print("df.query:\n",df.query(' 800 < Count_AnimalName '))
print("==================================================================================")
data = pd.Series([1, np.nan, 'hello', None])
print(data)
print("=============================")
print(data.isnull())
print("=============================")
print(data[data.isnull()])
print("=============================")
print(data[data.notnull()])
print("==================================================================================")
data = np.random.randint(0, 100, size=(5, 5))
index = list('ABCDE')
columns = list('甲乙丙丁毛')
df = pd.DataFrame(data=data, index=index, columns=columns)
print(df)
print("=============================")
print(df.values)
print("==================================================================================")
s = pd.Series(range(5))
print(s)
print("=============================")
print(s.where(s > 3))
print("==================================================================================")
# df.loc 通过标签索引行数据
# df.iloc 通过位置获取行数据
df = pd.read_csv(dog_file)
res = df[df['Count_AnimalName'] > 100]
print(res)
print("=============================")
print(df.loc[df['Row_Labels'] == 40804, :])
print("=============================")
df_notnull_contains = df[pd.notnull(df['Row_Labels']) & df['Row_Labels'].str.contains('EE')]
print(df_notnull_contains)
print("=============================")
print(df.Row_Labels.str.lower())
print("=============================")
print(df[pd.isnull(df.Row_Labels)])
print("=============================")
print(df.Count_AnimalName.values)
print("=============================")
print(df.Count_AnimalName.values.max())
print("=============================")
# how = all ，所有都 nan，则删除；how = any ，只要有1个 nan， 则删除
# inplace = True ，原地替换 ，返回值None
# inplace = Flase, 不原地替换，返回值 是 dataframe
df.dropna(axis=0,how='all',inplace=False)
print(df.count())
print("=============================")
df.dropna(axis=0,how='any',inplace=False)
print(df.count())
print("=============================")
df = df.dropna(axis=0,how='any',inplace=False)
print(df.count())
print("=============================")
"""
	对于NaN的数据，在numpy中我们是如何处理的？
	在pandas中我们处理起来非常容易
	
	判断数据是否为NaN：pd.isnull(df),pd.notnull(df)
	
	处理方式1：删除NaN所在的行列dropna (axis=0, how='any', inplace=False)
	处理方式2：填充数据，t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
	
	
	处理为0的数据：t[t==0]=np.nan
	当然并不是每次为0的数据都需要处理
	计算平均值等情况，nan是不参与计算的，但是0会
"""
